﻿using System;

namespace RuoVea.ExUtil;

/// <summary>
/// 描 述：验证扩展
/// </summary>
public static partial class Extensions
{
    /// <summary>
    /// 检测空值,为null则抛出ArgumentNullException异常
    /// </summary>
    /// <param name="obj">对象</param>
    /// <param name="parameterName">参数名</param>
    public static void CheckNull(this object obj, string parameterName)
    {
        if (obj == null)
            throw new ArgumentNullException(parameterName);
    }

    #region 是否为空
    /// <summary>
    /// 是否为空
    /// </summary>
    /// <param name="value">值</param>
    /// <returns>是否为空</returns>
    public static bool IsEmpty(this string value)
    {
        return string.IsNullOrWhiteSpace(value);
    }

    /// <summary>
    /// 是否为空
    /// </summary>
    /// <param name="value">值</param>
    /// <returns>是否为空</returns>
    public static bool IsEmpty(this Guid? value)
    {
        if (value == null)
            return true;
        return IsEmpty(value.Value);
    }

    /// <summary>
    /// 是否为空
    /// </summary>
    /// <param name="value">值</param>
    /// <returns>是否为空</returns>
    public static bool IsEmpty(this Guid value)
    {
        if (value == Guid.Empty)
            return true;
        return false;
    }

    /// <summary>
    /// 是否为空
    /// </summary>
    /// <param name="value">值</param>
    /// <returns>是否为空</returns>
    public static bool IsEmpty(this object value)
    {
        if (value != null && !string.IsNullOrEmpty(value.ToString()))
        {
            return false;
        }
        else
        {
            return true;
        }
    }
    #endregion

    #region 将传入的字符串中间部分字符替换成特殊字符
    /// <summary>
    /// 将传入的字符串中间部分字符替换成特殊字符
    /// </summary>
    /// <param name="value">需要替换的字符串</param>
    /// <param name="startLen">前保留长度</param>
    /// <param name="endLen">尾保留长度</param>
    /// <param name="specialChar">特殊字符</param>
    /// <returns>被特殊字符替换的字符串</returns>
    public static string ReplaceWithSpecialChar(this string value, int startLen = 4, int endLen = 4, char specialChar = '*')
    {
        try
        {
            int lenth = value.Length - startLen - endLen;

            string replaceStr = value.Substring(startLen, lenth);

            string specialStr = string.Empty;

            for (int i = 0; i < replaceStr.Length; i++)
            {
                specialStr += specialChar;
            }

            value = value.Replace(replaceStr, specialStr);
        }
        catch (Exception)
        {
            throw;
        }

        return value;
    }
    #endregion

    #region 枚举校验
    /// <summary>
    /// 枚举校验
    /// </summary>
    /// <typeparam name="enumType"></typeparam>
    /// <param name="value"></param>
    /// <returns></returns>
    public static bool IsDefined<enumType>(this Enum? value) where enumType : Enum
    {
        if (value == null) return false;
        try
        {
            return Enum.IsDefined(typeof(enumType), value);
        }
        catch { return false; }
    }
    #endregion
}
